<?php
//   +----------------------------------------------------------------------
//   | Copyright (c) 2015-2025 http://www.hdphp.cn All rights reserved.
//   | Licensed ( http://www.hdphp.cn/licenses/ )
//   | Author: Jack <sophia2152@qq.com>
//   | 官方网址: http://www.hdphp.cn
//   | 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用。
//   | 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
//   +----------------------------------------------------------------------
namespace hdphp\services\wechat;

use EasyWeChat\Kernel\Support\Collection;

/**
 * Class：微信错误
 * 创建人：Jack
 * 创建时间：2023/11/30 14:28
 * @package hdphp\services\wechat
 */
class WechatResponse extends Collection
{
    /**
     * @var \Throwable
     */
    protected $e;

    /**
     * @var string
     */
    protected $response;

    /**
     * 是否抛出默认错误
     * @var bool
     */
    protected $error = true;

    /**
     * WechatResponse constructor.
     * @param array $items
     */
    public function __construct(array $items = [])
    {
        parent::__construct($items);

        $this->wechatError();
    }

    /**
     * 注释：错误统一处理
     * 创建人：Jack
     * 创建时间：2023/11/30 14:28
     * @return void
     */
    public function wechatError()
    {
        if (!$this->error) {
            return;
        }
        if (isset($this->items['errcode']) && 0 !== $this->items['errcode']) {
            throw new WechatException(
                ErrorMessage::getWorkMessage(
                    $this->items['errcode'] ?? 0,
                    $this->items['errmsg'] ?? null
                )
            );
        }
    }

    /**
     * 注释：serError
     * 创建人：Jack
     * 创建时间：2023/11/30 14:28
     * @param bool $boole
     * @return $this
     */
    public function serError(bool $boole)
    {
        $this->error = $boole;
        return $this;
    }

    /**
     * 注释：正确处理
     * 创建人：Jack
     * 创建时间：2023/11/30 14:28
     * @param callable  $then
     * @param bool|null $error
     * @return $this
     */
    public function then(callable $then, bool $error = null)
    {
        $error = $error ?: $this->error;
        if (0 !== $this->items['errcode'] && $error) {
            throw new WechatException($this->items['errmsg']);
        }
        try {
            $this->response = $then(new static($this->items));
        } catch (\Throwable $e) {
            $this->e = $e;
        }
        return $this;
    }

    /**
     * 注释：异常处理
     * 创建人：Jack
     * 创建时间：2023/11/30 14:28
     * @param callable $catch
     * @return $this
     */
    public function catch(callable $catch)
    {
        if (!$this->e) {
            $this->e = new WechatException('success');
        }

        $catch($this->e, $this->items);
        return $this;
    }

    /**
     * 注释：获取返回值
     * 创建人：Jack
     * 创建时间：2023/11/30 14:29
     * @return string
     */
    public function getResponse()
    {
        return $this->response;
    }
}